from selenium import webdriver
from selenium.webdriver.common.by import By
from loguru import logger
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
import configparser
import os
from com.email import email_send



class Conf:
    def __init__(self):
        self.conf = configparser.ConfigParser()
        self.root_path = os.path.dirname(os.path.abspath(__file__))
        self.f = os.path.join(self.root_path + "/config.conf")
        self.conf.read(self.f)


    # 读取配置文件指定的option
    def read_conf(self, m, n):
        name = self.conf.get(m, n)
        return name


if __name__ == "__main__":


    # 实例化对象
    aa = Conf()

    # 获取 grafana 账户 and 密码
    grafana_username = aa.read_conf('grafana', 'username')
    grafana_password = aa.read_conf('grafana', 'password')

    # 获取 qq 账号 and 密码
    qq_username = aa.read_conf('email', 'username')
    qq_password = aa.read_conf('email', 'password')




    # 启动浏览器
    driver = webdriver.Chrome()


    # 访问爬取网页
    driver.get('http://192.168.93.101:3000/')


    # 页面最大化
    driver.maximize_window()


# 自动化测试: 登录主流程
    driver.find_element(By.XPATH, '//*[@id="reactRoot"]/div[1]/main/div/div/div/div[3]/div/div/div[2]/div/div/form/div[1]/div[2]/div/div/div/input').send_keys(f'{grafana_username}')
    logger.info(f"grafana账号: {grafana_username}")
    driver.find_element(By.XPATH, '//*[@id="current-password"]').send_keys(f'{grafana_password}')
    logger.info(f"grafana密码: {grafana_password}")


    ### 点击登录按钮
    driver.find_element(By.XPATH, '//*[@id="reactRoot"]/div[1]/main/div/div/div/div[3]/div/div/div[2]/div/div/form/button').click()


    try:
        # 5秒等待登录成功后的某个元素出现, 如详细信息的某个按钮, 如果不存在抛出异常日志
        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="reactRoot"]/div[1]/main/div[1]/div[2]/div[2]/div[4]/div[4]/div[1]/button[1]/div[2]/span/span[1]'))
        )
        logger.info("✅ 登录成功")
    except:
        logger.error("❌ 登录失败，可能是用户名或密码错误")


# 1、自动化测试: 截图相应资产图片主流程
    driver.implicitly_wait(3)  # 隐式等待3秒, 以防止主机性能拉跨, 导致页面不能第一时间显示, 从而报错
    driver.find_element(By.XPATH, '//*[@id="var-job"]/span').click()    # 点击 IP 找到要截图的主机
    driver.find_element(By.XPATH, '//*[@id="options-job"]/li[2]/button').click()


    # 截图一次 a.png
    driver.execute_script("document.body.style.zoom='40%'")     # 调整浏览器窗口大小, 截图更多信息
    # 截图保存
    time.sleep(3)
    driver.save_screenshot('a.png')

# 2、自动化测试: 截图相应资产图片主流程
    driver.implicitly_wait(3)  # 隐式等待3秒, 以防止主机性能拉跨, 导致页面不能第一时间显示, 从而报错
    driver.find_element(By.XPATH, '//*[@id="var-job"]/span').click()  # 点击 IP 找到要截图的主机
    driver.find_element(By.XPATH, '//*[@id="options-job"]/li[3]/button/span[2]').click()

    # 截图二次 b,png
    driver.execute_script("document.body.style.zoom='40%'")  # 调整浏览器窗口大小, 截图更多信息
    # 截图保存
    time.sleep(3)
    driver.save_screenshot('b.png')

    # 强制等待
    time.sleep(3)
    driver.quit()




    try:
        logger.info(f"qq账号: {qq_username}")
        logger.info(f"qq密码: {qq_password}")
        # 发送所有图片至邮箱
        email_send.main_qq('今日服务器负载如下', 'Hello, World', 'a.png', 'b.png', qq_username, qq_password)
        # 捕获所有异常抛出
    except Exception as e:
        print(f"捕获到异常: {e}")


